package main

import "fmt"
import "reflect"

type T struct {
	X    int  `max:"99" min:"0" default:"0"`
	Y, Z bool `optional:"yes"`
}

//结构的标签信息
//注意：
//键值对中的键不能包含空格（Unicode值为32）、双引号（Unicode值为34）和冒号（Unicode值为58）。
//为了形成键值对，所设想的键值对形式中的冒号的后面不能紧跟着空格字符。所以
//`optional: "yes"`不形成键值对。
//键值对中的值中的空格不会被忽略。所以
//`json:"author, omitempty“`、
//`json:" author,omitempty“`以及
//`json:"author,omitempty“`各不相同。
//每个字段标签应该呈现为单行才能使它的整个部分都对键值对的形成有贡献。
func main() {
	t := reflect.TypeOf(T{})
	x := t.Field(0).Tag
	y := t.Field(1).Tag
	z := t.Field(2).Tag
	fmt.Println(reflect.TypeOf(x)) // reflect.StructTag
	// v的类型为string
	v, present := x.Lookup("max")
	fmt.Println(len(v), v, present)   // 2 99 true
	fmt.Println(x.Get("max"))         // 99
	fmt.Println(x.Lookup("optional")) //  false
	fmt.Println(y.Lookup("optional")) // yes true
	fmt.Println(z.Lookup("optional")) // yes true
}
